// 从 @nestjs/common 包中导入 Module 装饰器，用于定义 NestJS 模块
import { Module } from '@nestjs/common';
// 导入应用控制器类，该类处理 HTTP 请求
import { AppController, CatsController, HttpController } from './app.controller';
import { UserApiController } from './user-api.controller';
import { OptionalProvidersController } from './optional-providers/optional-providers.controller';
// 导入应用服务类，该类包含业务逻辑
import { AppService, SomeService, HttpService } from './app.service';
// 导入可选依赖项模块
import { OptionalProvidersModule } from './optional-providers/optional-providers.module';
import { OptionalProvidersV2Module } from './optional-providers-v2/module';

/**
 * AppModule 是 NestJS 应用的根模块。
 * 模块是一个使用 @Module 装饰器注解的类，用于组织应用的结构。
 * 它可以包含控制器、提供者，并导入其他模块。
 */
@Module({
    // imports 数组用于导入其他模块
    imports: [
        // 方式1: 不带自定义配置注册（将使用默认配置）
        OptionalProvidersModule.register(),

        // 注册可选提供者V2模块
        OptionalProvidersV2Module,

        // 方式2: 带自定义配置注册
        // OptionalProvidersModule.register({
        //   config: {
        //     apiKey: 'custom-api-key',
        //     timeout: 10000,
        //     baseUrl: 'https://api.custom.com'
        //   }
        // }),
    ],
    // controllers 数组列出了该模块中包含的控制器
    controllers: [AppController, CatsController, HttpController, UserApiController, OptionalProvidersController],
    // providers 数组列出了该模块中包含的提供者（如服务、仓库等）
    providers: [AppService, SomeService, HttpService, {
        provide: 'HTTP_OPTIONS',
        useValue: {
            get: (url: string, headers?: Record<string, string>) => {
                const options: RequestInit = { headers };

                return fetch(url, options)
                    .then(response => {
                        // 检查响应是否成功
                        if (!response.ok) {
                            // 尝试从响应体获取错误详情
                            return response.text()
                                .then(text => {
                                    try {
                                        // 尝试解析为 JSON
                                        const errorData = JSON.parse(text);
                                        throw new Error(`HTTP error! status: ${response.status}, details: ${JSON.stringify(errorData)}`);
                                    } catch (jsonError) {
                                        // 如果不是 JSON，使用纯文本
                                        throw new Error(`HTTP error! status: ${response.status}, body: ${text}`);
                                    }
                                })
                                .catch(textError => {
                                    throw new Error(`HTTP error! status: ${response.status}, unable to read response body`);
                                });
                        }

                        // 尝试解析响应为 JSON
                        return response.text()
                            .then(text => {
                                try {
                                    return JSON.parse(text);
                                } catch (e) {
                                    return text;
                                }
                            });
                    })
                    .catch(error => {
                        console.error('Error in HTTP request:', error.message);
                        console.error('Error details:', error);
                        throw new Error(`Failed to make HTTP request: ${error.message}`);
                    });
            }
        }
    }, {
            provide: 'API_CONFIG',
            useValue: {
                token: '3a49a987504bb3a33998bc85801b24a9',
                baseUrl: 'http://192.168.1.212:3003',
                endpoints: {
                    userList: '/api/user/list'
                }
            }
        }],

    // exports 数组用于导出模块中的组件，以便其他模块可以使用
    // exports: [AppService, SomeService],
})
// 导出 AppModule 类，以便在应用启动文件中使用
export class AppModule {
    constructor(private readonly appService: AppService) { }
}